問題一、什麼是最大安全整數?
整數數值超過了number可以表達的範圍,也就是超過了 2^53-1
(9007199254740991
) 就會開始產生誤差,必須特別注意。這個數值又稱為最大安全整數,是 JavaScript 可以準確表示的最大整数。
而最大安全數是由下面程式碼得出來的。
Number.MAX_SAFE_INTEGER; //9007199254740991
問題二、BigInt是什麼?
如果整數超過最大安全整數,在 JavaScript計算中可能會出錯。所以會使用BigInt做處理,便能夠準確計算出很大很大的數字。
BigInt會在整數後面加上一個n,也適用於任何進位制。
1234n //BigInt字面值
0b11111n //二進位的BigInt
0o7777n //八進位的BigInt
0x8000000000000000n // 2n**63n :一個64位元整數
可以透過一個 Number 型別的 Number.isSafeInteger()
函式來判斷該數值物件是否為安全整數。
Number.isSafeInteger(1234); //true
Number.isSafeInteger(3.1); //false
BigInt不能和Number混再一起進行運算:
10n+5; //Cannot mix BigInt and other types...
問題三、BigInt 轉換 Number有什麼風險?
BigInt 和Number 兩者直接轉換一樣是錯誤的。
1234567890123456789012345678901234567890n;
//結果:1234567890123456789012345678901234567890n
Number(1234567890123456789012345678901234567890n);
//結果:1.2345678901234568e+39
問題四、BigInt運算是什麼?
加、減、乘都能夠精確表達出正確數字,但除法若有餘數會被捨去。
1000n+2000n; //3000n
3000n-2000n; //1000n
2000n*3000n; //6000000n
3000n/997n; //3n 用計算機算應為3.070624360286592,小數點後直接被BigInt捨去
2n/3n; //0n 小數點後直接被BigInt捨去
注意:
任何JavaScript的Math物件都不接受BigInt運算元。
Reference
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
https://blog.miniasp.com/post/2020/02/21/JavaScript-Numbers-Deep-Dive